#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"

typedef int ElemType;

typedef struct LNode{
	ElemType data;
	struct LNode* next;
}LNode, *LinkList;

//创建链表
void CreatList(LinkList& L, int n) {
	//创建头结点
	L = (LinkList)malloc(sizeof(LNode));
	L->next = L;  //链表尾结点指向链表头结点
	for (int i = 0; i < n; i++) {
		//创建创建新节点
		LinkList P = (LinkList)malloc(sizeof(LNode));
		scanf("%d", &P->data);
		P->next = L->next;
		L->next = P;
	}
}

//插入结点
bool ListInsert_L(LinkList &L,int i, ElemType e) {
	LinkList P = L;
	int j = 1;
	//让P指向i-1个结点
	while (P && j < i) {
		P = P->next;
		j++;
	}
	if (!P || j > i) return false;
	//创建新结点
	LinkList S = (LinkList)malloc(sizeof(LNode));
	S->data = e;
	S->next = P->next;
	P->next = S;
	return true;
}

//删除结点
bool ListDelete_L(LinkList &L, int i, ElemType &e) {
	LinkList P = L;
	int j = 1;
	//P指向第i-1个结点
	while (P && j < i) {
		P = P->next;
		j++;
	}
	if (!P || j > i) return false;
	LinkList Q = P->next;
	e = Q->data;
	P->next = Q->next;
	free(Q);
}

//输出链表
void PrintList(LinkList L) {
	LinkList P = L->next;
	while(P != L) {
		printf("%3d", P->data);
		P = P->next;
	}
	printf("\n");
}

int main() {
	ElemType e;  //接受返回的参数
	LinkList L;
	CreatList(L, 5);
	PrintList(L);
	ListInsert_L(L, 3, 9);
	PrintList(L);
	ListDelete_L(L, 5, e);
	printf("删除的元素为%d\n", e);
	PrintList(L);
	return 0;
}